﻿using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace CryptFighter
{
    /// <summary>
    /// Controla la reproducción de la animación.
    /// </summary>
    struct AnimacionPersonaje
    {
        /// <summary>
        /// Proporciona la animación que se está reproduciendo actualmente.
        /// </summary>
        public Animacion Animation
        {
            get { return animation; }
        }
        Animacion animation;

        /// <summary>
        /// Proporciona el índice de fotograma actual.
        /// </summary>
        public int FrameIndex
        {
            get { return frameIndex; }
        }
        int frameIndex;

        /// <summary>
        /// Tiempo para cada fotograma.
        /// </summary>
        private float time;

        /// <summary>
        /// Sitúa el origen de textura.
        /// </summary>
        public Vector2 Origin
        {
            get { return new Vector2(Animation.FrameWidth / 2.0f, Animation.FrameHeight); }
        }

        /// <summary>
        /// Empieza o continua la reproducción de la animación.
        /// </summary>
        public void PlayAnimation(Animacion animation)
        {
            if (Animation == animation)
                return;

            this.animation = animation;
            this.frameIndex = 0;
            this.time = 0.0f;
        }

        /// <summary>
        /// Avanza el fotograma y dibuja por pantalla la animación.
        /// </summary>
        public void Draw(GameTime gameTime, SpriteBatch spriteBatch, Vector2 position, SpriteEffects spriteEffects, Color spriteColor)
        {
            if (Animation == null)
                throw new NotSupportedException("No hay una animación reproduciendose.");

            // Procesa el tiempo.
            time += (float)gameTime.ElapsedGameTime.TotalSeconds;
            while (time > Animation.FrameTime)
            {
                time -= Animation.FrameTime;

                // Avanza el indice de fotograma.
                if (Animation.IsLooping)
                {
                    frameIndex = (frameIndex + 1) % Animation.FrameCount;
                }
                else
                {
                    frameIndex = Math.Min(frameIndex + 1, Animation.FrameCount - 1);
                }
            }

            // Calcula el rectangulo envolvente de la animación.
            Rectangle source = new Rectangle(FrameIndex * Animation.Texture.Height, 0, Animation.Texture.Height, Animation.Texture.Height);

            // Dibuja el fotograma actual.
            spriteBatch.Draw(Animation.Texture, position, source, spriteColor, 0.0f, Origin, 1.0f, spriteEffects, 0.0f);
        }
    }
}
